home *** CD-ROM | disk | FTP | other *** search
/ Amiga Format CD 42 / Amiga Format AFCD42 (Issue 126, Aug 1999).iso / -serious- / comms / other / slrn / slrn_src / src / slrndir.c < prev    next >
C/C++ Source or Header  |  1999-05-14  |  4KB  |  228 lines

  1. #include "config.h"
  2. #include "slrnfeat.h"
  3. /* Copyright (c) 1998 John E. Davis (davis@space.mit.edu)
  4.  *
  5.  * This file is part of slrn.
  6.  *
  7.  * Slrn is free software; you can redistribute it and/or modify it
  8.  * under the terms of the GNU General Public License as published by the
  9.  * Free Software Foundation; either version 2, or (at your option) any
  10.  * later version.
  11.  * 
  12.  * Slrn is distributed in the hope that it will be useful, but WITHOUT
  13.  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
  14.  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
  15.  * for more details.
  16.  * 
  17.  * You should have received a copy of the GNU General Public License
  18.  * along with Slrn; see the file COPYING.  If not, write to the Free
  19.  * Software Foundation, 59 Temple Place - Suite 330, 
  20.  * Boston, MA  02111-1307, USA.
  21.  */
  22.  
  23.  
  24. #include <stdio.h>
  25. #include <string.h>
  26.  
  27. #ifdef HAVE_STDLIB_H
  28. # include <stdlib.h>
  29. #endif
  30. #ifdef HAVE_UNISTD_H
  31. # include <unistd.h>
  32. #endif
  33.  
  34. #ifndef VMS
  35. # include <sys/types.h>
  36. # include <sys/stat.h>
  37. #else
  38. # include "vms.h"
  39. #endif
  40.  
  41. #ifndef VMS
  42. /* I have no idea whether or not this works under VMS.  Please let me know
  43.  * if it does.
  44.  */
  45. #if HAVE_DIRENT_H
  46. # include <dirent.h>
  47. #else
  48. # ifdef HAVE_DIRECT_H
  49. #  include <direct.h>
  50. # else
  51. #  define dirent direct
  52. #  define NEED_D_NAMLEN
  53. #  if HAVE_SYS_NDIR_H
  54. #   include <sys/ndir.h>
  55. #  endif
  56. #  if HAVE_SYS_DIR_H
  57. #   include <sys/dir.h>
  58. #  endif
  59. #  if HAVE_NDIR_H
  60. #   include <ndir.h>
  61. #  endif
  62. # endif
  63. #endif
  64.  
  65. #else                       /* VMS */
  66. #define DIR int
  67. #endif
  68.  
  69. #include "util.h"
  70. #include "slrndir.h"
  71. #include "ttymsg.h"
  72.  
  73. struct _Slrn_Dir_Type 
  74. {
  75.    DIR *dp;
  76. };
  77.  
  78. Slrn_Dir_Type *slrn_open_dir (char *dir)
  79. {
  80. #ifdef VMS
  81.    slrn_error ("slrn_open_dir has not been ported to VMS");
  82.    return NULL;
  83. #else
  84.    Slrn_Dir_Type *d;
  85.    DIR *dp;
  86.  
  87.    d = (Slrn_Dir_Type *) slrn_malloc (sizeof (Slrn_Dir_Type), 1, 1);
  88.    if (d == NULL)
  89.      return NULL;
  90.    
  91.    if (NULL == (dp = opendir (dir)))
  92.      {
  93.     slrn_free ((char *)d);
  94.     return NULL;
  95.      }
  96.    
  97.    d->dp = dp;
  98.    return d;
  99. #endif
  100. }
  101.  
  102. void slrn_close_dir (Slrn_Dir_Type *d)
  103. {
  104. #ifndef VMS
  105.    if (d == NULL) return;
  106.    closedir (d->dp);
  107.    slrn_free ((char *)d);
  108. #endif
  109. }
  110.  
  111. Slrn_Dirent_Type *slrn_read_dir (Slrn_Dir_Type *d)
  112. {
  113. #ifdef VMS
  114.    return NULL;
  115. #else
  116.    struct dirent *ep;
  117.    unsigned int len;
  118.    static Slrn_Dirent_Type dir;
  119.  
  120.    if (d == NULL) return NULL;
  121.    ep = readdir (d->dp);
  122.    if (ep == NULL)
  123.      return NULL;
  124.    
  125.    memset ((char *) &dir, 0, sizeof(Slrn_Dirent_Type));
  126.    
  127. #ifdef NEED_D_NAMLEN
  128.    len = ep->d_namlen;
  129. #else
  130.    len = strlen (ep->d_name);
  131. #endif
  132.    
  133.    if (len > SLRN_MAX_PATH_LEN)
  134.      len = SLRN_MAX_PATH_LEN;
  135.  
  136.    strncpy (dir.name, ep->d_name, len);
  137.    dir.name [len] = 0;
  138.    
  139.    dir.name_len = len;
  140.  
  141.    return &dir;
  142. #endif
  143. }
  144.  
  145.  
  146.  
  147. /* This function is from JED */
  148. char *slrn_getcwd (char *cwdbuf, unsigned int buflen)
  149. {
  150.    static char cwd[SLRN_MAX_PATH_LEN];
  151.    char *c;
  152.    
  153.    if (cwdbuf != NULL)
  154.      *cwdbuf = 0;
  155.  
  156. #ifdef HAVE_GETCWD
  157. # if defined (__EMX__)
  158.    c = _getcwd2(cwd, sizeof(cwd)-1);   /* includes drive specifier */
  159. # else
  160.    c = getcwd(cwd, sizeof(cwd)-1);     /* djggp includes drive specifier */
  161. # endif
  162. #else
  163.    c = (char *) getwd(cwd);
  164. #endif
  165.  
  166.    if (c == NULL)
  167.      {
  168. #ifndef REAL_UNIX_SYSTEM
  169.     slrn_error ("Unable to getcwd");
  170.     return NULL;
  171. #else
  172.     struct stat st1, st2;
  173.  
  174.     if ((NULL == (c = getenv ("PWD")))
  175.         || (-1 == stat (c, &st1))
  176.         || (-1 == stat (".", &st2))
  177.         || (st1.st_dev != st2.st_dev)
  178.         || (st1.st_ino != st2.st_ino))
  179.       {
  180.          slrn_error ("Unable to getcwd");
  181.          return NULL;
  182.       }
  183.  
  184.     strncpy (cwd, c, sizeof (cwd));
  185.     cwd [sizeof (cwd) - 1] = 0;
  186. #endif
  187.      }
  188.    
  189.    if (cwdbuf == NULL)
  190.      return cwd;
  191.  
  192.    strncpy (cwdbuf, cwd, buflen);
  193.    if (buflen) cwdbuf[buflen - 1] = 0;
  194.    return cwdbuf;
  195. }
  196.  
  197. int slrn_chdir (char *dir)
  198. {
  199.    unsigned int len;
  200.    char dirbuf[SLRN_MAX_PATH_LEN + 1];
  201.  
  202.    if (dir == NULL)
  203.      return -1;
  204.    
  205.    strncpy (dirbuf, dir, SLRN_MAX_PATH_LEN);
  206.    dirbuf[SLRN_MAX_PATH_LEN] = 0;
  207.    len = strlen (dirbuf);
  208.    
  209.    /* I may have to add code to handle something like C:/ */
  210.    if ((len > 1) && (dirbuf[len - 1] == SLRN_PATH_SLASH_CHAR))
  211.      {
  212.     len--;
  213.     dirbuf [len] = 0;
  214.      }
  215.    
  216. #if defined(IBMPC_SYSTEM)
  217.    slrn_os2_convert_path (dirbuf);
  218. #endif
  219.    
  220.    if (-1 == chdir (dirbuf))
  221.      {
  222.     slrn_error ("chdir %s failed.  Does the directory exist?", dirbuf);
  223.     return -1;
  224.      }
  225.    
  226.    return 0;
  227. }
  228.